#extension GL_OES_EGL_image_external : require
precision highp float;

uniform vec2                iResolution;
uniform float               zoom;
uniform samplerExternalOES  sTexture;
varying vec2                vTextureCoord;

// referenced the method of bitmap of iq : https://www.shadertoy.com/view/4dfXWj

//#define r iResolution.xy
//#define t iGlobalTime

//#define zoom 2.

#define X 1
#define _ 0

#define P(id,a,b,c,d,e,f,g,h) if( id == int(pos.y) ){ int pa = a+2*(b+2*(c+2*(d+2*(e+2*(f+2*(g+2*(h))))))); cha = floor(mod(float(pa)/pow(2.,float(pos.x)-1.),2.)); }

float gray(vec3 _i)
{
    return (_i.x+_i.y+_i.z)/3.;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = vec2(floor(fragCoord.x/8./zoom)*8.*zoom,floor(fragCoord.y/12./zoom)*12.*zoom)/iResolution;
    ivec2 pos = ivec2(mod(fragCoord.x/zoom,8.),mod(fragCoord.y/zoom,12.));
    vec4 tex = texture2D(sTexture,uv);
    float cha = 0.;

    {
        float g = gray(tex.xyz);
        if( g < .125 )
        {
            P(11,_,_,_,_,_,_,_,_);
            P(10,_,_,_,_,_,_,_,_);
            P( 9,_,_,_,_,_,_,_,_);
            P( 8,_,_,_,_,_,_,_,_);
            P( 7,_,_,_,_,_,_,_,_);
            P( 6,_,_,_,_,_,_,_,_);
            P( 5,_,_,_,_,_,_,_,_);
            P( 4,_,_,_,_,_,_,_,_);
            P( 3,_,_,_,_,_,_,_,_);
            P( 2,_,_,_,_,_,_,_,_);
            P( 1,_,_,_,_,_,_,_,_);
            P( 0,_,_,_,_,_,_,_,_);
        }
        else if( g < .25 ) // .
        {
            P(11,_,_,_,_,_,_,_,_);
            P(10,_,_,_,_,_,_,_,_);
            P( 9,_,_,_,_,_,_,_,_);
            P( 8,_,_,_,_,_,_,_,_);
            P( 7,_,_,_,_,_,_,_,_);
            P( 6,_,_,_,_,_,_,_,_);
            P( 5,_,_,_,_,_,_,_,_);
            P( 4,_,_,_,X,X,_,_,_);
            P( 3,_,_,_,X,X,_,_,_);
            P( 2,_,_,_,_,_,_,_,_);
            P( 1,_,_,_,_,_,_,_,_);
            P( 0,_,_,_,_,_,_,_,_);
        }
        else if( g < .375 ) // ,
        {
            P(11,_,_,_,_,_,_,_,_);
            P(10,_,_,_,_,_,_,_,_);
            P( 9,_,_,_,_,_,_,_,_);
            P( 8,_,_,_,_,_,_,_,_);
            P( 7,_,_,_,_,_,_,_,_);
            P( 6,_,_,_,_,_,_,_,_);
            P( 5,_,_,_,_,_,_,_,_);
            P( 4,_,_,_,X,X,_,_,_);
            P( 3,_,_,_,X,X,_,_,_);
            P( 2,_,_,_,_,X,_,_,_);
            P( 1,_,_,_,X,_,_,_,_);
            P( 0,_,_,_,_,_,_,_,_);
        }
        else if( g < .5 ) // -
        {
            P(11,_,_,_,_,_,_,_,_);
            P(10,_,_,_,_,_,_,_,_);
            P( 9,_,_,_,_,_,_,_,_);
            P( 8,_,_,_,_,_,_,_,_);
            P( 7,_,_,_,_,_,_,_,_);
            P( 6,X,X,X,X,X,X,X,_);
            P( 5,_,_,_,_,_,_,_,_);
            P( 4,_,_,_,_,_,_,_,_);
            P( 3,_,_,_,_,_,_,_,_);
            P( 2,_,_,_,_,_,_,_,_);
            P( 1,_,_,_,_,_,_,_,_);
            P( 0,_,_,_,_,_,_,_,_);
        }
        else if(g < .625 ) // +
        {
            P(11,0,0,0,0,0,0,0,0);
            P(10,0,0,0,0,0,0,0,0);
            P(9,0,0,0,1,0,0,0,0);
            P(8,0,0,0,1,0,0,0,0);
            P(7,0,0,0,1,0,0,0,0);
            P(6,1,1,1,1,1,1,1,0);
            P(5,0,0,0,1,0,0,0,0);
            P(4,0,0,0,1,0,0,0,0);
            P(3,0,0,0,1,0,0,0,0);
            P(2,0,0,0,0,0,0,0,0);
            P(1,0,0,0,0,0,0,0,0);
            P(0,0,0,0,0,0,0,0,0);
        }
        else if(g < .75 ) // *
        {
            P(11,0,0,0,0,0,0,0,0);
            P(10,0,0,0,1,0,0,0,0);
            P(9,1,0,0,1,0,0,1,0);
            P(8,0,1,0,1,0,1,0,0);
            P(7,0,0,1,1,1,0,0,0);
            P(6,0,0,0,1,0,0,0,0);
            P(5,0,0,1,1,1,0,0,0);
            P(4,0,1,0,1,0,1,0,0);
            P(3,1,0,0,1,0,0,1,0);
            P(2,0,0,0,1,0,0,0,0);
            P(1,0,0,0,0,0,0,0,0);
            P(0,0,0,0,0,0,0,0,0);
        }
        else if(g < .875 ) // #
        {
            P(11,0,0,0,0,0,0,0,0);
            P(10,0,0,1,0,0,1,0,0);
            P(9,0,0,1,0,0,1,0,0);
            P(8,1,1,1,1,1,1,1,0);
            P(7,0,0,1,0,0,1,0,0);
            P(6,0,0,1,0,0,1,0,0);
            P(5,0,1,0,0,1,0,0,0);
            P(4,0,1,0,0,1,0,0,0);
            P(3,1,1,1,1,1,1,1,0);
            P(2,0,1,0,0,1,0,0,0);
            P(1,0,1,0,0,1,0,0,0);
            P(0,0,0,0,0,0,0,0,0);
        }
        else // @
        {
            P(11,0,0,0,0,0,0,0,0);
            P(10,0,0,1,1,1,1,0,0);
            P(9,0,1,0,0,0,0,1,0);
            P(8,1,0,0,0,1,1,1,0);
            P(7,1,0,0,1,0,0,1,0);
            P(6,1,0,0,1,0,0,1,0);
            P(5,1,0,0,1,0,0,1,0);
            P(4,1,0,0,1,0,0,1,0);
            P(3,1,0,0,1,1,1,1,0);
            P(2,0,1,0,0,0,0,0,0);
            P(1,0,0,1,1,1,1,1,0);
            P(0,0,0,0,0,0,0,0,0);
        }
	}

    //vec3 col = vec3(1.);
    fragColor = vec4(cha,cha,cha,1.);
}

// Bitmap to ASCII (not really) fragment shader by movAX13h, September 2013
// This is the original shader that is now used in PixiJs ans various other products.

// Here's a little tool for new characters: thrill-project.com/archiv/coding/bitmap/

float character(float n, vec2 p)
{
	p = floor(p*vec2(4.0, -4.0) + 2.5);
	if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y)
	{
		if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;
	}
	return 0.0;
}

void mainImage2( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 uv = fragCoord.xy;
	vec3 col = texture2D(sTexture, floor(uv/32.0)*32.0/iResolution.xy).rgb;

	float gray = 0.3 * col.r + 0.59 * col.g + 0.11 * col.b;

	float n =  4096.0;             // .
	if (gray > 0.2) n = 65600.0;    // :
	if (gray > 0.3) n = 332772.0;   // *
	if (gray > 0.4) n = 15255086.0; // o
	if (gray > 0.5) n = 23385164.0; // &
	if (gray > 0.6) n = 15252014.0; // 8
	if (gray > 0.7) n = 13199452.0; // @
	if (gray > 0.8) n = 11512810.0; // #

	vec2 p = mod(uv/16.0, 2.0) - vec2(1.0);
	if (zoom > 2.0)	col = gray*vec3(character(n, p));
	else col = col*character(n, p);

	fragColor = vec4(col, 1.0);
}

void main() {
	mainImage(gl_FragColor, vTextureCoord * iResolution);
}